# 导入必要的库
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.datasets import load_iris

# 设置中文显示
plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False  # 用来正常显示负号

# 加载鸢尾花数据集
iris = load_iris()
X = iris.data
y = iris.target
feature_names = iris.feature_names
target_names = iris.target_names

# 将数据转换为DataFrame格式，便于处理
iris_df = pd.DataFrame(X, columns=feature_names)
iris_df['species'] = [target_names[i] for i in y]

# 创建一个函数来显示所有可视化图表
def show_iris_visualizations():
    # 设置图表风格
    sns.set(style="whitegrid")
    
    # 1. 显示数据集基本信息
    print("鸢尾花数据集基本信息：")
    print(f"样本数量: {X.shape[0]}")
    print(f"特征数量: {X.shape[1]}")
    print(f"特征名称: {feature_names}")
    print(f"目标类别: {target_names}")
    print("\n数据集前5行:")
    print(iris_df.head())
    print("\n数据集统计信息:")
    print(iris_df.describe())
    
    # 2. 散点图矩阵 - 使用seaborn的pairplot
    plt.figure(figsize=(12, 10))
    pair_plot = sns.pairplot(iris_df, hue="species", markers=["o", "s", "D"])
    pair_plot.fig.suptitle("鸢尾花数据集 - 特征散点图矩阵", y=1.02, fontsize=16)
    plt.tight_layout()
    plt.savefig("iris_pairplot.png")
    plt.close()
    
    # 3. 箱线图 - 比较不同种类的特征分布
    plt.figure(figsize=(14, 8))
    for i, feature in enumerate(feature_names):
        plt.subplot(2, 2, i+1)
        sns.boxplot(x="species", y=feature, data=iris_df)
        plt.title(f"{feature} 在不同种类中的分布")
    plt.tight_layout()
    plt.savefig("iris_boxplots.png")
    plt.close()
    
    # 4. 小提琴图 - 另一种查看分布的方式
    plt.figure(figsize=(14, 8))
    for i, feature in enumerate(feature_names):
        plt.subplot(2, 2, i+1)
        sns.violinplot(x="species", y=feature, data=iris_df, inner="stick")
        plt.title(f"{feature} 在不同种类中的分布 (小提琴图)")
    plt.tight_layout()
    plt.savefig("iris_violinplots.png")
    plt.close()
    
    # 5. 热图 - 显示特征之间的相关性
    plt.figure(figsize=(10, 8))
    correlation = iris_df.drop('species', axis=1).corr()
    mask = np.triu(correlation)
    sns.heatmap(correlation, annot=True, fmt='.2f', cmap='coolwarm', mask=mask)
    plt.title("鸢尾花数据集 - 特征相关性热图", fontsize=14)
    plt.tight_layout()
    plt.savefig("iris_correlation.png")
    plt.close()
    
    # 6. 3D散点图 - 使用三个特征
    fig = plt.figure(figsize=(12, 10))
    ax = fig.add_subplot(111, projection='3d')
    
    # 为每个种类选择不同的颜色和标记
    colors = ['blue', 'red', 'green']
    markers = ['o', '^', 's']
    
    for i, species in enumerate(target_names):
        # 筛选出当前种类的数据
        species_data = iris_df[iris_df['species'] == species]
        
        # 绘制3D散点图
        ax.scatter(species_data[feature_names[0]], 
                  species_data[feature_names[1]], 
                  species_data[feature_names[2]],
                  c=colors[i], marker=markers[i], s=60, label=species, alpha=0.7)
    
    ax.set_xlabel(feature_names[0])
    ax.set_ylabel(feature_names[1])
    ax.set_zlabel(feature_names[2])
    ax.set_title("鸢尾花数据集 - 3D散点图", fontsize=14)
    ax.legend()
    plt.tight_layout()
    plt.savefig("iris_3d_scatter.png")
    plt.close()
    
    # 7. 直方图 - 查看每个特征的分布
    plt.figure(figsize=(14, 10))
    for i, feature in enumerate(feature_names):
        plt.subplot(2, 2, i+1)
        for species, color in zip(target_names, colors):
            # 筛选出当前种类的数据
            species_data = iris_df[iris_df['species'] == species]
            # 绘制直方图
            sns.histplot(species_data[feature], color=color, label=species, kde=True, alpha=0.5)
        plt.title(f"{feature} 分布直方图")
        plt.legend()
    plt.tight_layout()
    plt.savefig("iris_histograms.png")
    plt.close()
    
    print("\n所有可视化图表已生成并保存为PNG文件。")
    print("生成的文件包括：")
    print("- iris_pairplot.png (散点图矩阵)")
    print("- iris_boxplots.png (箱线图)")
    print("- iris_violinplots.png (小提琴图)")
    print("- iris_correlation.png (相关性热图)")
    print("- iris_3d_scatter.png (3D散点图)")
    print("- iris_histograms.png (直方图)")

# 执行可视化函数
if __name__ == "__main__":
    show_iris_visualizations()
    
    # 显示一个图表作为示例（散点图矩阵）
    plt.figure(figsize=(12, 10))
    pair_plot = sns.pairplot(iris_df, hue="species", markers=["o", "s", "D"])
    pair_plot.fig.suptitle("鸢尾花数据集 - 特征散点图矩阵", y=1.02, fontsize=16)
    plt.tight_layout()
    plt.show()  # 显示图表